package com.example.minibom.service;

import com.example.minibom.feign.PartFeign;
import com.huawei.innovation.rdm.coresdk.basic.enums.ConditionType;
import com.huawei.innovation.rdm.coresdk.basic.vo.QueryRequestVo;
import com.huawei.innovation.rdm.coresdk.basic.vo.RDMErrorVO;
import com.huawei.innovation.rdm.coresdk.basic.vo.RDMParamVO;
import com.huawei.innovation.rdm.coresdk.basic.vo.RDMResultVO;
import com.huawei.innovation.rdm.minibom.dto.entity.PartUpdateDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * 零件服务类，用于处理与零件相关的操作。
 */
@Service
public class PartService {

    @Autowired
    private PartFeign partFeign;

    /**
     * 获取所有最新版本的零件。
     *
     * @return 包含最新版本零件的RDMResultVO。
     */
    public RDMResultVO getAllLatestVersion() {
        // 新建一个List存储最新版本的part
        List<Object> result = new ArrayList<>();

        // 准备查询参数对象
        RDMParamVO<QueryRequestVo> var1 = new RDMParamVO<>();
        QueryRequestVo params = new QueryRequestVo();
        var1.setParams(params);

        // 从feign客户端获取所有零件
        RDMResultVO all = partFeign.find("Part", var1);

        // 使用哈希表记录<masterId, Part>键值对
        LinkedHashMap<Long, Object> latestVersionMap = new LinkedHashMap<>();
        for (Object item : all.getData()) {
            LinkedHashMap<String, Object> partMap = (LinkedHashMap<String, Object>) item;
            Object master = partMap.get("master");
            LinkedHashMap<String, Object> masterMap = (LinkedHashMap<String, Object>) master;
            Long masterId = Long.parseLong(masterMap.get("id").toString());
            latestVersionMap.put(masterId, partMap);
        }

        // 将哈希表中的值添加到结果列表中
        for (Object obj : latestVersionMap.values()) {
            result.add(obj);
        }

        // 准备并返回最终结果
        RDMResultVO rdmResultVO = new RDMResultVO();
        rdmResultVO.setData(result);
        rdmResultVO.setResult("SUCCESS");
        return rdmResultVO;
    }

    /**
     * 根据名称查找零件。
     *
     * @param name 要查找的零件名称。
     * @return 包含匹配名称零件的RDMResultVO。
     */
    public RDMResultVO findByName(String name) {
        // 新建一个List存储找到的part
        List<Object> result = new ArrayList<>();

        // 准备查询参数对象
        RDMParamVO<QueryRequestVo> var1 = new RDMParamVO<>();
        QueryRequestVo params = new QueryRequestVo();
        var1.setParams(params);

        // 添加条件以根据名称过滤part
        params.addCondition("name", ConditionType.EQUAL, name);

        // 从feign客户端获取符合条件的零件
        RDMResultVO all = partFeign.find("Part", var1);

        // 使用哈希表记录<masterId, Part>键值对
        LinkedHashMap<Long, Object> latestVersionMap = new LinkedHashMap<>();
        for (Object item : all.getData()) {
            LinkedHashMap<String, Object> partMap = (LinkedHashMap<String, Object>) item;
            Object master = partMap.get("master");
            LinkedHashMap<String, Object> masterMap = (LinkedHashMap<String, Object>) master;
            Long masterId = Long.parseLong(masterMap.get("id").toString());
            latestVersionMap.put(masterId, partMap);
        }

        // 将哈希表中的值添加到结果列表中
        for (Object obj : latestVersionMap.values()) {
            result.add(obj);
        }

        // 准备并返回最终结果
        RDMResultVO rdmResultVO = new RDMResultVO();
        rdmResultVO.setData(result);
        rdmResultVO.setResult("SUCCESS");
        return rdmResultVO;
    }

    /**
     * 更新零件信息。
     *
     * @param part 包含更新零件信息的PartUpdateDTO。
     * @return 表示更新操作成功或失败的RDMResultVO。
     */
    public RDMResultVO update(PartUpdateDTO part) {
        // 准备结果对象
        RDMResultVO result = new RDMResultVO();

        // 准备更新参数对象
        RDMParamVO<PartUpdateDTO> var1 = new RDMParamVO<>();
        var1.setParams(part);

        // 调用feign客户端更新零件信息
        LinkedHashMap<String, Object> response = partFeign.update("Part", var1);

        // 打印响应以便调试
        System.out.println(response.toString());

        // 如果返回结果中的result字段为SUCCESS，则更新成功
        if (response.get("result").equals("SUCCESS")) {
            result.setResult("SUCCESS");
            return result;
        } else {
            result.setResult("FAILED");

            // 根据响应准备错误对象
            RDMErrorVO error = new RDMErrorVO();
            error.setCode(response.get("error_code").toString());
            error.setMessage(response.get("error_msg").toString());

            // 将错误对象添加到结果的错误列表中
            List<RDMErrorVO> errors = new ArrayList<>();
            errors.add(error);
            result.setErrors(errors);

            // 返回包含错误信息的结果
            return result;
        }
    }
}
